package com.aimee.jobscheduler;

import android.app.ActivityManager;
import android.app.job.JobParameters;
import android.app.job.JobService;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import java.util.List;

/**
 * 创建一个JobService的子类，作为系统回调终端
 */
public class MyJobScheduler extends JobService {
    /**
     * 当Job开始执行时，将回调该方法，因此该方法中为所执行的内容，该方法执行在应用主线程中。
     *
     * 当该方法执行完毕后，如果返回true，那么也就意味着Job将一直处于激活的状态，依旧持有WakeLock锁；
     * 如果返回false表示该Job完成后，将不会再继续进行，释放WakeLock锁。
     * @param params
     * @return
     */
    @Override
    public boolean onStartJob(JobParameters params) {

        //如果返回true,有如下三种方式结束该Job的执行：
        //1.调用JobFinished()方法通知系统已经完成其工作;
        //2.调用cancel()方法取消该Job，此时将回调onStopJob()方法;
        //3.如果没有任何处理，JobSchedulerService中将在600s后回调onStopJob()方法，并在8s后结束该Job的执行。
        //因此，如果onStartJob()执行完毕后，不再需要重复执行，则返回值更推荐使用false，当执行完毕任务后，将立即释放WakeLock锁，从而更好地优化功耗。
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    if (!isServiceExisted(MyJobScheduler.this, PhoneService.class.getName())) {
                        Log.i(MyJobScheduler.class.getName(), "PhoneService 不存在了，拉起 PhoneService");
                        Intent intent = new Intent(MyJobScheduler.this, PhoneService.class);
                        MyJobScheduler.this.startService(intent);
                    } else {
                        Log.i(MyJobScheduler.class.getName(), "PhoneService 还在");
                    }
                    try {
                        Thread.sleep(5 * 1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        return true;
    }

    /**
     * 如果在调用前JobFinished()系统停止该Job，则将回调该方法。
     * 比如在执行该Job过程中约束条件不满足导致停止了，这种情况下将回调该方法，然后将释放WakeLock锁。
     *
     * 该方法返回true，则表示是否需要根据该Job创建时提供的重新执行策略重新调度该Job。
     * 返回false，则表示该job完全停止。
     * @param params
     * @return
     */
    @Override
    public boolean onStopJob(JobParameters params) {
        //返回false表示停止后不再重试执行
        return false;
    }

    public static boolean isServiceExisted(Context context, String className) {
        ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningServiceInfo> serviceList =activityManager.getRunningServices(Integer.MAX_VALUE);
        if(!(serviceList.size() > 0)) {
            return false;
        }
        for(int i = 0; i < serviceList.size(); i++) {
            ActivityManager.RunningServiceInfo serviceInfo = serviceList.get(i);
            ComponentName serviceName = serviceInfo.service;
            if(serviceName.getClassName().equals(className)) {
                return true;
            }
        }
        return false;
    }
}
